<h2>URL 构建</h2>

<p>如果可以匹配 URL ，那么 beego 也可以生成 URL 吗？当然可以。 UrlFor() 函数就是用于构建指定函数的 URL 的。它把对应控制器和函数名结合的字符串作为第一个参数，其余参数对应 URL 中的变量。未知变量将添加到 URL 中作为查询参数。 例如：</p>

<p>下面定义了一个相应的控制器</p>

<pre><code>type TestController struct {
    beego.Controller
}

func (this *TestController) Get() {
    this.Data[&quot;Username&quot;] = &quot;astaxie&quot;
    this.Ctx.Output.Body([]byte(&quot;ok&quot;))
}

func (this *TestController) List() {
    this.Ctx.Output.Body([]byte(&quot;i am list&quot;))
}

func (this *TestController) Params() {
    this.Ctx.Output.Body([]byte(this.Ctx.Input.Params()[&quot;0&quot;] + this.Ctx.Input.Params()[&quot;1&quot;] + this.Ctx.Input.Params()[&quot;2&quot;]))
}

func (this *TestController) Myext() {
    this.Ctx.Output.Body([]byte(this.Ctx.Input.Param(&quot;:ext&quot;)))
}

func (this *TestController) GetUrl() {
    this.Ctx.Output.Body([]byte(this.UrlFor(&quot;.Myext&quot;)))
}
</code></pre>

<p>下面是我们注册的路由：</p>

<pre><code>beego.Router(&quot;/api/list&quot;, &amp;TestController{}, &quot;*:List&quot;)
beego.Router(&quot;/person/:last/:first&quot;, &amp;TestController{})
beego.AutoRouter(&amp;TestController{})
</code></pre>

<p>那么通过方式可以获取相应的URL地址：</p>

<pre><code>beego.URLFor(&quot;TestController.List&quot;)
// 输出 /api/list

beego.URLFor(&quot;TestController.Get&quot;, &quot;:last&quot;, &quot;xie&quot;, &quot;:first&quot;, &quot;asta&quot;)
// 输出 /person/xie/asta

beego.URLFor(&quot;TestController.Myext&quot;)
// 输出 /Test/Myext

beego.URLFor(&quot;TestController.GetUrl&quot;)
// 输出 /Test/GetUrl
</code></pre>

<h2>模板中如何使用</h2>

<p>默认情况下，beego 已经注册了 urlfor 函数，用户可以通过如下的代码进行调用</p>

<pre><code>{ {urlfor &quot;TestController.List&quot;} }
</code></pre>

<p>为什么不在把 URL 写死在模板中，反而要动态构建？有两个很好的理由：</p>

<ol>
    <li>反向解析通常比硬编码 URL 更直观。同时，更重要的是你可以只在一个地方改变 URL ，而不用到处乱找。<br /></li>
    <li>URL 创建会为你处理特殊字符的转义和 Unicode 数据，不用你操心。<br /></li>
</ol>